package com.itheima.topic3;

import org.junit.Test;

import javax.xml.namespace.QName;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class MyTest {
    /**
     * 写一个方法，此方法可将obj对象中名为propertyName的属性的值设置为value.
     * - Object  obj  ：  对象 （实例化的对象）
     * - String  propertyName ： 属性名（成员变量名）
     * - Object  value ： 属性值（成员变量的数据值）
     * - 方法的功能： 给obj对象中的propertyName属性，赋值为value
     */
    public void setProperty(Object obj, String propertyName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Class<?> cls = obj.getClass();
        Field propertyName1 = cls.getDeclaredField(propertyName);
        propertyName1.setAccessible(true);
        propertyName1.set(obj, value);
    }


    /**
     * 写一个方法，此方法可以获取obj对象中名为propertyName的属性的值
     * - Object  obj ： 对象 （实例化的对象）
     * - String  propertyName ： 属性名（成员变量名）
     * - 方法的功能： 获取obj对象中的propertyName属性的值
     */
    public Object getProperty(Object obj, String propertyName) throws NoSuchFieldException, IllegalAccessException {
        Class<?> cls = obj.getClass();
        Field f = cls.getDeclaredField(propertyName);
        f.setAccessible(true);
        return f.get(obj);
    }


    @Test
    public void testSetProperty() throws NoSuchFieldException, IllegalAccessException {
        //测试1
        Obj obj = new Obj();
        String propertyName = "name";
        setProperty(obj, propertyName, "666");
        Field field = obj.getClass().getDeclaredField(propertyName);
        field.setAccessible(true);
        System.out.println(field.get(obj));     //666
        //测试2
        System.out.println(getProperty(obj, propertyName)); //666
    }

}


